/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.protocolo.Protocolo;
import br.com.deployment.entidade.protocolo.ServicoProtocolo;
import br.com.deployment.entidade.selo.Selo;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.*;
import br.com.deployment.util.SeloModel;
import br.com.deployment.util.ServicoProtocoloModel;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.component.tabview.Tab;
import org.primefaces.component.tabview.TabView;

/**
 *
 * @author roniere
 */
@ManagedBean
@ViewScoped
public class ManagerProtocoloSelo implements Serializable {

    @EJB
    ProtocoloServico protocoloServico;
    @EJB
    SeloServico seloServico;
    @EJB
    PessoaServico pessoaServico;
    @EJB
    LivroServico livroServico;
    @EJB
    FolhaServico folhaServico;
    
    private List<ServicoProtocolo> lstServProtocolo;
    private ServicoProtocoloModel servicoProtocoloModel;
    private ServicoProtocolo servProtocolo;
    private List<Selo> lstSelos;
    private SeloModel seloModel;
    private Selo[] selos;
    private Protocolo protocolo;
    private List<ServicoProtocolo> lstAux;
    private Integer codProtocolo;
    private boolean selar;
    private Selo selo;
    private Selo seloVer;
    private String folhas;
    
    //Busca
    private Protocolo buscarProtocolo;
    private Selo seloVerBuscar;
    private Tab tab;
    private TabView tabView;
    private List<Protocolo> protocolos;
    


    @PostConstruct
    public void init() {
        buscarProtocolo = new Protocolo();
        protocolos = new ArrayList<Protocolo>();
        tab = new Tab();
        tabView = new TabView();
        tab.setRendered(false);
        System.err.println("INIT");
    }
  
    

    public Selo getSeloVerBuscar() {
        return seloVerBuscar;
    }

    public String getFolhas() {
        return folhas;
    }

    public void setFolhas(String folhas) {
        this.folhas = folhas;
    }

    public void setSeloVerBuscar(Selo seloVerBuscar) {
        this.seloVerBuscar = seloVerBuscar;
    }

    
    
    public List<Protocolo> getProtocolos() {
        return protocolos;
    }

    public void setProtocolos(List<Protocolo> protocolos) {
        this.protocolos = protocolos;
    }
    

    public TabView getTabView() {
        return tabView;
    }

    public void setTabView(TabView tabView) {
        this.tabView = tabView;
    }
    
    

    public Tab getTab() {
        return tab;
    }

    public void setTab(Tab tab) {
        this.tab = tab;
    }
    
    
    public Protocolo getBuscarProtocolo() {
        return buscarProtocolo;
    }

    public void setBuscarProtocolo(Protocolo buscarProtocolo) {
        this.buscarProtocolo = buscarProtocolo;
    }

  
    
    public Selo getSeloVer() {
        return seloVer;
    }

    public void setSeloVer(Selo seloVer) {
        this.seloVer = seloVer;
    }
    
    

    public Selo getSelo() {
        return selo;
    }

    public void setSelo(Selo selo) {
        this.selo = selo;
    }
    
    
    public boolean isSelar() {
        return selar;
    }

    public void setSelar(boolean selar) {
        this.selar = selar;
    }

    public Integer getCodProtocolo() {
        return codProtocolo;
    }

    public void setCodProtocolo(Integer codProtocolo) {
        this.codProtocolo = codProtocolo;
    }

    public List<ServicoProtocolo> getLstAux() {
        return lstAux;
    }

    public void setLstAux(List<ServicoProtocolo> lstAux) {
        this.lstAux = lstAux;
    }

    public List<Selo> getLstSelos() {
        return lstSelos;
    }

    public void setLstSelos(List<Selo> lstSelos) {
        this.lstSelos = lstSelos;
    }

    public SeloModel getSeloModel() {
        return seloModel;
    }

    public void setSeloModel(SeloModel seloModel) {
        this.seloModel = seloModel;
    }

    public Selo[] getSelos() {
        return selos;
    }

    public void setSelos(Selo[] selos) {
        this.selos = selos;
    }

    public ServicoProtocoloModel getServicoProtocoloModel() {
        return servicoProtocoloModel;
    }

    public void setServicoProtocoloModel(ServicoProtocoloModel servicoProtocoloModel) {
        this.servicoProtocoloModel = servicoProtocoloModel;
    }

    public ServicoProtocolo getServProtocolo() {
        return servProtocolo;
    }

    public void setServProtocolo(ServicoProtocolo servProtocolo) {
        this.servProtocolo = servProtocolo;
    }

    public Protocolo getProtocolo() {
        return protocolo;
    }

    public void setProtocolo(Protocolo protocolo) {
        this.protocolo = protocolo;
    }

    public List<ServicoProtocolo> getLstServProtocolo() {

        return lstServProtocolo;
    }

    public void setLstServProtocolo(List<ServicoProtocolo> lstServProtocolo) {
        this.lstServProtocolo = lstServProtocolo;
    }

      
    public void protocoloGetSelos(int id){
        seloVerBuscar = new Selo();
        seloVerBuscar = seloServico.find(id);
    }
    
    public void loadToSelar(){
        tab.setRendered(true);
        tabView.setActiveIndex(1);
        
        lstServProtocolo = new ArrayList<ServicoProtocolo>();
        lstSelos = new ArrayList<Selo>();
        servProtocolo = new ServicoProtocolo();
        protocolo = new Protocolo();
        selo = new Selo();
        seloVer = new Selo();
        selar = false;
    }
    
    public void cancelToSelo(){
        tab.setRendered(false);
        tabView.setActiveIndex(0);
    }
    
     public void buscar(){
        if(buscarProtocolo.getCliente() != null)
            buscarProtocolo.setCliente(pessoaServico.find(buscarProtocolo.getCliente().getId()));
            protocolos = protocoloServico.buscar(buscarProtocolo);
        
        for (int i = 0; i < protocolos.size(); i++) {
           protocolos.get(i).setServicoProtocolos(protocoloServico.servicoProtocolos(protocolos.get(i)));
        }
    }
     
     public void redirect(String string) {
        try {
            FacesContext context = FacesContext.getCurrentInstance();
            context.getExternalContext().redirect(string);
            
        } catch (IOException ex) {
            Logger.getLogger(ManagerProtocolo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void protocoloToSelarIndex(int id){
        redirect("protocoloSelo.xhtml");
        protocoloToSelar(id);
    }

    public void protocoloToSelar(int id) {
         loadToSelar();
        if (id != 0) {
            protocolo = protocoloServico.getProtocoloToSelar(id);
            if(protocolo != null){
               
                lstAux = protocoloServico.servicoProtocolos(protocolo);
                servicoProtocoloModel = new ServicoProtocoloModel(lstAux);
                lstSelos = new ArrayList<Selo>();
                seloModel = new SeloModel(lstSelos);
                selar = true;
                
            }
        } else {
            selar = false;
        }
        
    }
    
    public void cancelarSeloProtocolo(int id){
        protocoloServico.cancelarSeloProtocolo(id); 
    }

    public void ver() {
        lstSelos = protocoloServico.sugerirSelo(servProtocolo.getAtoItem(), allSelo());
        seloModel = new SeloModel(lstSelos);

    }

    public void reinitTableSelo() {
        seloModel = new SeloModel();
    }

    public List<Selo> allSelo() {
        List<Selo> selos = new ArrayList<Selo>();
        for (ServicoProtocolo sp : lstServProtocolo) {
            for (Selo selo : sp.getSelos()) {
                selos.add(selo);
            }
        }
        return selos;
    }

    public void atribuirSelo() {
        List<Selo> s = new ArrayList<Selo>();
        if(livroServico.folhasFind(servProtocolo.getLivro(), folhas)){
            servProtocolo.setLivro(livroServico.find(servProtocolo.getLivro().getId()));
            servProtocolo.setFolhas(folhaServico.folhasFind(folhas, servProtocolo.getLivro().getId()));
            servProtocolo.setFolhasString(folhas);
            if (selos.length > 0) {
                for (Selo selo : selos) {
                    s.add(selo);
                }
            } 
            if(selo != null && selo.getTipoSelo() != null){
                s.add(seloServico.findSeloUsr(selo));
                servProtocolo.setSelos(s);
                selo = new Selo();
            }
            if(selos.length > 0 && selo == null){
                Msg.messagemWarn("Selecione o selo !");
                return;
            }
            for (Selo selo : s) {
                System.err.println("- ---"+selo.getNumero());
            }
            servProtocolo.setSelos(s);
            lstServProtocolo.add(servProtocolo);
            lstAux.remove(servProtocolo);

            servProtocolo = new ServicoProtocolo();
            servicoProtocoloModel = new ServicoProtocoloModel(lstAux);
            reinitTableSelo();
            
        }
    }

    public void selarProtocolo() {
//        if(lstAux.isEmpty()){
            lstServProtocolo.addAll(lstAux);
            this.protocolo.setServicoProtocolos(lstServProtocolo);
            protocoloServico.atualizar(protocolo);
            Msg.messagemInfo("Protocolo Selado com Sucesso !!");
//        }else{
//            Msg.messagemWarn("Há Serviços pendentes");
//        }
    }
    
    public void teste(int id){
        System.err.println("SELO OOOO ");
        seloVer = new Selo();
        seloVer = seloServico.find(id);
        System.err.println(id);
    }
    
    

}
